package co.com.bean.documento;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.DocumentoDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.DocumentoFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartDocumento;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class DocumentoBean
 */
@Stateless(mappedName = "ejb/DocumentoBean")
public class DocumentoBean implements DocumentoBeanLocal{
	private DocumentoFacadeLocal facade;
	
	public DocumentoBean(){
		facade = DelegateContextEJB.getDocumentoFacadeLocal();
	}
	
	@Override
	public ResponseJson insertarDocumento(DocumentoDTO documentoDTO) {
		ResponseJson response = new ResponseJson(); 
		try {
			facade.create(Mapper.mapperDtoToSmartDocumento(documentoDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento almacenado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento almacenado.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar el Documento.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}
		return response ;
	}
	
	@Override
	public List<DocumentoDTO> consultarAllDocumento(){
		List<DocumentoDTO> Documento = new ArrayList<DocumentoDTO>();
		for (SmartDocumento entity : facade.findAll()) {
			if(entity.getSmfhretiro() == null){
				Documento.add(Mapper.mapperSmartDocumentoToDto(entity));
			}
		}

		return Documento;
	}

	@Override
	public DocumentoDTO consultarDocumentoId(DocumentoDTO DocumentoDTO) {
		DocumentoDTO Documento = new DocumentoDTO();	
		SmartDocumento entity  = facade.find(DocumentoDTO.getScdocumento());
		if(entity != null && entity.getSmfhretiro() == null){
			Documento = Mapper.mapperSmartDocumentoToDto(entity);
		}
		return Documento;
	}

	@Override
	public ResponseJson editDocumento(DocumentoDTO documentoDTO) {
		ResponseJson response = new ResponseJson(); 
		try {
			documentoDTO.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperDtoToSmartDocumento(documentoDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento editado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento editado.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar el Documento.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}
		return response ;
	}

	@Override
	public ResponseJson removeDocumento(DocumentoDTO documentoDTO,  boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				documentoDTO.setFhretiro(new Date());
				documentoDTO.setFhmodificacion(new Date());

				facade.edit(Mapper.mapperDtoToSmartDocumento(documentoDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento inactivado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento inactivado.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar el Documento.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperDtoToSmartDocumento(documentoDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento eliminado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Documento eliminado.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar el Documento.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}
}
